לוקליזציה היא תהליך של התאמת אתר לשפה ולמיקום גיאוגרפי מסוימים. המדריך הבא ידון באלמנטים השונים של התאמת אתר לשפות שונות ובכלים שקיימים ב-PHP לפיתוח אתרים שדוברים יותר משפה אחת.
לחץ כאן כדי להגיע לחלק הראשון של לוקליזציה ב-PHP.
הערה
לקנפג את gettext על מגוון פלטפורמות יכול להיות בעייתי, ישנן פלטפורמות שלא תומכות ב-gettext בברירת מחדל ולכן חלקים במדריך הזה עלולים לא לעבוד. אם אתם נתקלים בבעיה עם הקונפיגרציה של gettext תשאירו תגובה, ואני אשתדל לעזור.
Poedit
בשביל להוסיף תמיכה בלוקליזציה אנחנו צריכים ליצור קבצי תרגום לשפות שבהם אנחנו מעוניינים לתמוך. קבצי התרגום הם קבצים בעלי הסיומת .po שמכילים את המחרוזת המקורית ואת המחרוזת המתורגמת זה לצד זה, ובשביל לערוך אותם ניתן להשתמש ב-poedit.
קבצי התרגום שלנו צריכים להיות בתוך מבנה תיקיות כזה:
locale
he_IL.UTF-8
LC_MESSAGES
he_IL.UTF-8
LC_MESSAGES
התיקיה locale מכילה את כל קבצי התרגום של השפות השונות. לאחר מכן ישנה התיקיה של השפה הספציפית שאנחנו מעוניינים לתמוך בה, במקרה הזה he_IL.UTF-8 לעברית. he_IL.UTF-8 היא מחרוזת שמייצגת locale, שהוא בעצם השפה (ולפעמים גם הקידוד כמו במקרה הזה). בתוכה אנחנו יוצרים תיקיית LC_MESSAGES, ובה נשים את קבצי התרגום (קבצי ה-po/mo).
בשימוש הראשון בתוכנה נתבקש להכניס את השם ואת המייל שלנו, poedit יכניס את הפרטים הללו לקבצי התרגום, אך אין חובה לספק אותם. לאחר מכן נלך ל-file->new catalog בשביל ליצור קטלוג חדש של מחרוזות. נתבקש להכניס פרטים שונים אודות קובץ התרגום כמו שם הפרוייקט שאותו קובץ שייך לו ושפת התרגום. תמלאו את הפרטים המתאימים כמו בדוגמה.
לאחר מכן נלך לטאב paths, שם נשים את המיקום של התיקיה שבה נמצאים קבצי ה-PHP שלנו. כשנלחץ על OK, התוכנה תייצר קובץ po ותשאל אותנו היכן אנחנו מעוניינים לשמור אותו. נלך למבנה התיקיות הקיים שלנו ונשמור את הקובץ בתוך תיקיית ה-LC_MESSAGES של השפה שאנחנו מעוניינים לתרגם (במקרה הזה he_IL.UTF-8 לעברית). אין כרגע מחרוזות לתרגם לכן חלון התוכנה ריק.
נלך לתיקיה שבה יהיו קבצי ה-PHP שלנו ונשים שם את הקובץ index.php עם התוכן הבא:
<?php echo gettext(“My first gettext translated string”); ?>
נחזור ל-Poedit ונלחץ על הכפתור update catalog (הכפתור עם התמונה של הגלובוס). Poedit תסרוק את התיקיה ותחפש אחרי קריאות לפונקציה gettext. התוכנה תציג לנו את כל המחרוזות שהיא מצאה, נלחץ על OK בשביל לראות את המחרוזת בחלון הראשי של התוכנה. שם נוכל לתרגם את המחרוזות באמצעות בחירת המחרוזת, והכנסת טקסט אלטרנטיבי באזור הטקסט התחתון. לאחר שתרגמנו את המחרוזות נלחץ על ctrl+s בשביל לשמור את הקטלוג.
gettext וקביעת locale
הפונקציה gettext עוטפת את המחרוזות שנרצה לתרגם באפליקציה שלנו. לאחר שנאמר ל-getttext באיזה שפה אנחנו מעוניינים להציג את הטקסט, הפונקציה תחפש אחר קובץ mo שמתאים לשפה שביקשנו ואם היא מוצאת אותו היא תחליף את הטקסט בטקסט בשפה שנבחרה מתוך קובץ ה-mo. שם נרדף לפונקציה gettext הוא מקף תחתון (_). מכיוון שפעמים רבות יהיות מחרוזות תרגום רבות בתוך הקוד שלנו, הפונקציה _ היא קיצור נוח.
בכדי ש-gettext תוכל לתרגם את המחרוזת שלנו, אנחנו צריכים קודם כל לומר לה היכן נמצאים מחרוזות התרגום והשפה שבה אנחנו מעוניינים. שימו את הקוד הבא ב-index.php.
<?php
header("Content-type: text/html; charset=utf-8");
$locale = "he_IL.UTF-8";
$domain = "default";
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
putenv("LC_ALL=$locale");
putenv("LC_MESSAGES=$locale");
setlocale(LC_ALL, $locale);
setlocale(LC_MESSAGES, $locale);
bindtextdomain($domain, "./locale");
textdomain($domain);
echo _("Hello World");
?>
header("Content-type: text/html; charset=utf-8");
$locale = "he_IL.UTF-8";
$domain = "default";
putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
putenv("LC_ALL=$locale");
putenv("LC_MESSAGES=$locale");
setlocale(LC_ALL, $locale);
setlocale(LC_MESSAGES, $locale);
bindtextdomain($domain, "./locale");
textdomain($domain);
echo _("Hello World");
?>
השורה הראשונה אומרת לדפדפן שהקידוד של הדף הוא utf-8, ניתן להסיר את השורה הזו, אבל יכול להיות שתקבלו ג'בריש כי הדפדפן ינסה להציג את הטקסט בקידוד אחר.
המשתנה $locale מכיל את השם של ה-locale שאנחנו מעוניינים בו, במקרה הזה he_IL.UTF-8, ה-locale צריך להיות תואם לשם של תיקיית ה-po שלכם.
המשתנה $domain מכיל את השם של קבצי התרגום (po/mo). במקרה הזה default כי ככה קראנו לקבצים כאשר שמרנו אותם ב-poedit, אך השם יכול להיות שונה.
השורות שמתחילות ב-putenv או setlocale מגדירות משתני סביבה שמגדירים את ה-locale של הסקריפט. לא חייבים להגדיר את כל המשתנים הללו, אך כדי להבטיח שהפונקציונאליות תעבוד על פלטפורמות שונות בלי כאב ראש מאוד ממליץ להגדיר את כולם.
הפונקציה bindtextdomain אומרת ל-gettext היכן נמצאים קבצים התרגום. הארגיומנט הראשון הוא השם של קבצי התרגום (במקרה הזה default) שבהם אנחנו מעוניינים להשתמש. הארגיומנט השני הוא המיקום של תיקיית ה-locale שלנו. במקרה הזה בגלל שהיא נמצאת באותו תיקיה שבה נמצא index.php אנחנו מספקים מיקום יחסי.
עד עכשיו רק הגדרנו את gettext ואמרנו לו איפה נמצאים קבצי התרגום, אך כדי לגרום ל-gettext להתחיל לתרגם את המחרוזות נשתמש בפונקציה textdomain עם הדומיין (default).
ניתן להגדיר מספר קבצי תרגום ולבסוף להשתמש בפונקציה textdomain בשביל לבחור אחד מהם.
השורה האחרונה מדפיסה את המחרוזת Hello World למסך בברירת מחדל, אך מכיוון שהגדרנו את gettext להשתמש בקובץ התרגום, gettext תחפש אחרי מחרוזות תרגום בתוך קובץ ה-mo ואם היא מוצאת היא תציג אותו במקום.
נלך ל-poedit ונעדכן את הקטלוג (update catalog). התוכנה תסרוק את התיקיות שמוגדרות ב-paths (שהגדרנו קודם לכן) ותחפש את כל המקומות שבהם מופיעות פונקציות gettext (בעיקר _ ו-gettext).
בתמונת המסך למעלה ניתן לראות שהיא מצאה מחרוזת אחת. נלחץ על ok ונתרגם את המחרוזת בתוך חלון התוכנה. לאחר שסיימנו לתרגם את כל המחרוזות נשמור את השינויים שלנו.
בדפדפן נפתח את הסקריפט והתוצאה היא מחרוזת מתורגמת:
בחלק השלישי במדריך ניצור דוגמה שלמה יותר עם כפתור לשינוי שפת הממשק.
תגובות לכתבה:
תודה רבה, נראה טוב. :)
דרך אגב, אנחנו משתמשים באותו theme של linux... :)
נשאר רק לחכות בקוצר רוח לחלק השלישי ולהוסיף ש wordpress עובד בדיוק ככה.
מדריך יפה מאוד.
שאלה: אני רוצה לשייך טקסט כדי שהמתרגם \ אני נוכל לזהות לאיזה עמוד שייך הטקסט הזה ואולי ללכת לראות אותו במקור באתר. איך מומלץ לעשות את זה? נניח טקסט של עמוד "מבצעים" יתויג כשייך לעמוד הזה.
יש לי אתר סטטי (HTML ללא שום מערכת ניהול תוכן וצריך להישאר ככה) מתורגם כרגע ל5 שפות, אני רוצה להכין לו תשתית נוחה יותר לתרגום בעתיד (יש כ130 עמודים בכל שפה). יש רעיון לדרך גישה?
אתה יכול ליצור קובץ po נפרד לכל עמוד. יהיו לך 130 כאלה
תסתכל על קובץ ה-po, התוכנה מוסיפה אוטומטית את השורה בקובץ שבו נמצאת מחרוזת התרגום מעל ה-msgid.